package bit_pratice.day6;

/**
 * @author 美女
 * @date 2022/05/05 19:45
 **/

/**
 * 字符串转换为整数，不能使用库函数，数值为 0 或者字符串不是一个合法的数值则返回 0
 * 数据范围：字符串长度满足 0≤n≤100
 * 进阶：空间复杂度O(1)，时间复杂度O(n)
 * 注意：
 * ①字符串中可能出现任意符号，出现除+或-以外符号时直接输出 0
 * ②字符串中可能出现+或-且仅可能出现在字符串首位。
 */
    //字符串中有无除正负号外的其他字符，正负字符情况（标记位）
    //数字字符串转为整数：sum=charAt(i)*10+sum
public class Num2_StringToInt {
    public static int StrToInt(String str) {
        int res=0;//记录结果
        //字符串转为字符数组——便于后续处理正负号（把正负号变为‘0’）
        char[] chars=str.toCharArray();
        if(chars.length==0||chars==null){
            return 0;
        }
        //设置标记位，处理正负号情况
        //正数时flag=1,负数时flag=-1;
        //同时0下标是正负号时，让这两个正负号都变为字符‘0’
        int flag=1;
        if(chars[0]=='-') {
            flag = -1;//负数时flag变为-1
            chars[0]='0';
        }
        if(chars[0]=='+'){
            chars[0]='0';
        }
        //遍历字符数组
        for (int i = 0; i < chars.length; i++) {
            //i必须从0开始取值，从1开始会影响本身没有正负号的数字
            //上面我们对chars[0]处的正负号进行了变为0字符的处理了，可以直接处理数字，不影响最终结果，0×任何数都为0
            if(chars[i]>='0'&&chars[i]<='9'){
                res=res*10+chars[i]-'0';//数字字符i-字符0=数字i
            }else{
                res=0;
                break;
            }
        }
        return flag*res;//在存在其他字符时，res置为0了，同时*flag是考虑负数情况,第一个字符是负号时flag=-1，乘下来保证这个整数是负数
    }
}
